package com.example.demo7cache.dao;

import com.example.demo7cache.entity.Person;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.util.List;

@Repository
//@CacheConfig(cacheNames = "person")
public class PersonDao {

    @Resource
    private PersonRepository personRepository;

//    @Cacheable(key = "#id")
    public Person get(int id) {
        return personRepository.findById(id);
    }



//    @CachePut(key = "#person.getId()")
    //    @CachePut   // @CachePut：配置于函数上，能够根据参数定义条件来进行缓存，
    // 它与@Cacheable不同的是，它每次都会真是调用函数，所以主要用于数据新增和修改操作上。
    // 它的参数与@Cacheable类似，具体功能可参考上面对@Cacheable参数的解析
//    @CacheEvict(cacheNames = "person")
    //    @CacheEvict：配置于函数上，通常用在删除方法上，用来从缓存中移除相应数据。除了同@Cacheable一样的参数之外，它还有下面两个参数：
    //    allEntries：非必需，默认为false。当为true时，会移除所有数据
    //    beforeInvocation：非必需，默认为false，会在调用方法之后移除数据。当为true时，会在调用方法之前移除数据。
    public void update(Person person) {
        personRepository.update(person.getId(), person.getName(), person.getAge());
    }

//    @CachePut(key = "#person.getId()")
    public void save(Person person) {
        personRepository.save(person);
    }

//    @CacheEvict(cacheNames = {"person", "personList"}, condition = "#id==id")
    public void delete(int id) {
        personRepository.delete(id);
    }

//    @Cacheable(cacheNames = {"personList", "person"})
    public List<Person> getAll() {
        return personRepository.findAll();
    }


}
